#!/bin/bash

# Sokit CLI Linux 完整打包脚本
# 包含依赖检查、构建、打包和发布

set -e

echo "=========================================="
echo "Sokit CLI Linux 完整打包脚本"
echo "=========================================="

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 打印带颜色的消息
print_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

print_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查系统信息
check_system() {
    print_info "检查系统信息..."
    
    if [[ "$OSTYPE" == "linux-gnu"* ]]; then
        print_success "检测到Linux系统"
    else
        print_error "此脚本仅支持Linux系统"
        exit 1
    fi
    
    # 检测发行版
    if [[ -f /etc/os-release ]]; then
        . /etc/os-release
        print_info "发行版: $NAME $VERSION"
    fi
    
    # 检测架构
    ARCH=$(uname -m)
    print_info "架构: $ARCH"
    
    if [[ "$ARCH" != "x86_64" ]]; then
        print_warning "当前架构为 $ARCH，建议在 x86_64 架构上运行"
    fi
}

# 检查必要的工具
check_dependencies() {
    print_info "检查依赖..."
    
    local missing_deps=()
    
    # 检查基本工具
    for tool in cmake g++ make git; do
        if ! command -v $tool &> /dev/null; then
            missing_deps+=($tool)
        fi
    done
    
    # 检查Qt6
    if ! pkg-config --exists Qt6Core Qt6Network 2>/dev/null; then
        missing_deps+=("Qt6开发包")
    fi
    
    if [[ ${#missing_deps[@]} -gt 0 ]]; then
        print_error "缺少以下依赖:"
        for dep in "${missing_deps[@]}"; do
            echo "  - $dep"
        done
        
        print_info "安装依赖:"
        if command -v apt &> /dev/null; then
            echo "  Ubuntu/Debian: sudo apt update && sudo apt install cmake g++ make git qt6-base-dev qt6-tools-dev"
        elif command -v yum &> /dev/null; then
            echo "  CentOS/RHEL: sudo yum install cmake gcc-c++ make git qt6-qtbase-devel qt6-qttools-devel"
        elif command -v pacman &> /dev/null; then
            echo "  Arch: sudo pacman -S cmake gcc make git qt6-base qt6-tools"
        else
            echo "  请根据您的发行版安装上述依赖"
        fi
        exit 1
    fi
    
    print_success "所有依赖检查通过"
}

# 清理构建目录
clean_build() {
    print_info "清理构建目录..."
    rm -rf build-cli
    mkdir -p build-cli
    print_success "构建目录已清理"
}

# 配置构建
configure_build() {
    print_info "配置构建..."
    cd build-cli
    
    # 尝试不同的Qt6配置
    local qt_configs=(
        "-DQT_QMAKE_EXECUTABLE=$(which qmake6 2>/dev/null || which qmake)"
        "-DQt6_DIR=$(pkg-config --variable=prefix Qt6Core)/lib/cmake/Qt6"
        ""
    )
    
    local config_success=false
    
    for config in "${qt_configs[@]}"; do
        print_info "尝试配置: cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_AUTOMOC=ON -DCMAKE_AUTOUIC=ON -DCMAKE_AUTORCC=ON $config"
        
        if cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_AUTOMOC=ON -DCMAKE_AUTOUIC=ON -DCMAKE_AUTORCC=ON $config; then
            config_success=true
            print_success "CMake配置成功"
            break
        else
            print_warning "CMake配置失败，尝试下一个配置..."
        fi
    done
    
    if [[ "$config_success" == false ]]; then
        print_error "所有CMake配置都失败了"
        cd ..
        exit 1
    fi
    
    cd ..
}

# 构建项目
build_project() {
    print_info "构建项目..."
    cd build-cli
    
    # 获取CPU核心数
    local cores=$(nproc)
    print_info "使用 $cores 个CPU核心进行构建"
    
    if cmake --build . --target sokit-cli --config Release -j$cores; then
        print_success "构建成功"
    else
        print_error "构建失败"
        cd ..
        exit 1
    fi
    
    cd ..
}

# 测试可执行文件
test_executable() {
    print_info "测试可执行文件..."
    
    if [[ -f "build-cli/bin/sokit-cli" ]]; then
        if ./build-cli/bin/sokit-cli --version &> /dev/null; then
            print_success "可执行文件测试通过"
        else
            print_error "可执行文件测试失败"
            exit 1
        fi
    else
        print_error "未找到可执行文件"
        exit 1
    fi
}

# 创建发布包
create_package() {
    print_info "创建发布包..."
    
    local PACKAGE_DIR="sokit-cli-linux"
    local VERSION="1.3.1"
    local ARCH=$(uname -m)
    local DISTRO=""
    
    # 检测发行版
    if [[ -f /etc/os-release ]]; then
        . /etc/os-release
        DISTRO=$(echo $ID | tr '[:upper:]' '[:lower:]')
    fi
    
    rm -rf $PACKAGE_DIR
    mkdir -p $PACKAGE_DIR
    
    # 复制可执行文件
    cp build-cli/bin/sokit-cli $PACKAGE_DIR/
    chmod +x $PACKAGE_DIR/sokit-cli
    
    # 创建版本信息
    cat > $PACKAGE_DIR/VERSION << EOF
Sokit CLI Linux Version
Version: $VERSION
Architecture: $ARCH
Distribution: $DISTRO
Build Date: $(date)
EOF

    # 创建README
    cat > $PACKAGE_DIR/README.txt << 'EOF'
Sokit CLI - Linux 命令行版本
================================

这是一个高性能的TCP/UDP数据转发工具的命令行版本。

使用方法:
---------
sokit-cli [选项] <源地址:端口> <目标地址:端口>

选项:
  -t, --tcp        使用TCP协议
  -u, --udp        使用UDP协议
  -v, --verbose    详细输出
  -q, --quiet      静默模式
  -s, --stats      显示传输统计
  --timeout <秒>   连接超时时间 (默认: 30秒)
  -h, --help       显示帮助信息
  --version        显示版本信息

示例:
------
# TCP转发: 将本地8080端口转发到远程服务器9090端口
sokit-cli -t 127.0.0.1:8080 192.168.1.100:9090

# UDP转发: 将本地9090端口转发到远程服务器8080端口
sokit-cli -u 127.0.0.1:9090 192.168.1.100:8080

# 显示详细信息和统计
sokit-cli -t -v -s 127.0.0.1:8080 192.168.1.100:9090

# 静默模式运行
sokit-cli -t -q 127.0.0.1:8080 192.168.1.100:9090

特性:
-----
- 高性能TCP/UDP数据转发
- 支持高并发连接
- 实时传输统计
- 详细的连接日志
- 内存优化的缓冲区管理
- 跨平台支持

系统要求:
---------
- Linux x86_64 (推荐)
- Qt6 Runtime Libraries
- 网络连接

安装:
------
1. 解压此包到任意目录
2. 确保系统已安装Qt6运行时库
3. 运行: ./sokit-cli --help

许可证:
-------
GPL v3 - 详见LICENSE文件
EOF

    # 创建安装脚本
    cat > $PACKAGE_DIR/install.sh << 'EOF'
#!/bin/bash

# Sokit CLI 安装脚本

set -e

echo "安装 Sokit CLI..."

# 检查是否为root用户
if [ "$EUID" -eq 0 ]; then
    INSTALL_DIR="/usr/local/bin"
    echo "以root权限安装到系统目录: $INSTALL_DIR"
else
    INSTALL_DIR="$HOME/.local/bin"
    echo "安装到用户目录: $INSTALL_DIR"
    mkdir -p $INSTALL_DIR
fi

# 复制可执行文件
cp sokit-cli $INSTALL_DIR/
chmod +x $INSTALL_DIR/sokit-cli

echo "安装完成!"
echo "使用方法: sokit-cli --help"

# 检查PATH
if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
    echo ""
    echo "注意: $INSTALL_DIR 不在PATH中"
    echo "请将以下行添加到 ~/.bashrc 或 ~/.zshrc:"
    echo "export PATH=\"\$PATH:$INSTALL_DIR\""
fi
EOF

    chmod +x $PACKAGE_DIR/install.sh
    
    # 创建卸载脚本
    cat > $PACKAGE_DIR/uninstall.sh << 'EOF'
#!/bin/bash

# Sokit CLI 卸载脚本

set -e

echo "卸载 Sokit CLI..."

# 检查是否为root用户
if [ "$EUID" -eq 0 ]; then
    INSTALL_DIR="/usr/local/bin"
    echo "从系统目录卸载: $INSTALL_DIR"
else
    INSTALL_DIR="$HOME/.local/bin"
    echo "从用户目录卸载: $INSTALL_DIR"
fi

# 删除可执行文件
if [ -f "$INSTALL_DIR/sokit-cli" ]; then
    rm -f $INSTALL_DIR/sokit-cli
    echo "已删除: $INSTALL_DIR/sokit-cli"
else
    echo "未找到安装的文件: $INSTALL_DIR/sokit-cli"
fi

echo "卸载完成!"
EOF

    chmod +x $PACKAGE_DIR/uninstall.sh
    
    # 创建快速测试脚本
    cat > $PACKAGE_DIR/test.sh << 'EOF'
#!/bin/bash

# Sokit CLI 快速测试脚本

echo "测试 Sokit CLI..."

# 测试版本信息
if ./sokit-cli --version; then
    echo "✓ 版本信息测试通过"
else
    echo "✗ 版本信息测试失败"
    exit 1
fi

# 测试帮助信息
if ./sokit-cli --help &> /dev/null; then
    echo "✓ 帮助信息测试通过"
else
    echo "✗ 帮助信息测试失败"
    exit 1
fi

echo "所有测试通过!"
echo "现在可以使用: ./sokit-cli -t 127.0.0.1:8080 目标服务器:端口"
EOF

    chmod +x $PACKAGE_DIR/test.sh
    
    # 创建压缩包
    local package_name="sokit-cli-linux-${VERSION}-${ARCH}"
    if [[ -n "$DISTRO" ]]; then
        package_name="${package_name}-${DISTRO}"
    fi
    
    tar -czf "${package_name}.tar.gz" $PACKAGE_DIR/
    
    print_success "发布包创建完成:"
    echo "  - 目录: $PACKAGE_DIR/"
    echo "  - 压缩包: ${package_name}.tar.gz"
}

# 显示使用说明
show_usage() {
    echo ""
    echo "使用方法:"
    echo "  ./build_linux_package.sh [选项]"
    echo ""
    echo "选项:"
    echo "  --clean     清理构建目录"
    echo "  --help      显示此帮助信息"
    echo ""
    echo "构建的产品:"
    echo "  - sokit-cli: 命令行版本"
    echo "  - sokit-cli-linux-*.tar.gz: Linux发布包"
    echo ""
    echo "示例:"
    echo "  ./build_linux_package.sh                    # 完整构建"
    echo "  ./build_linux_package.sh --clean           # 清理后构建"
    echo ""
}

# 主函数
main() {
    case "${1:-}" in
        --clean)
            clean_build
            ;;
        --help|-h)
            show_usage
            exit 0
            ;;
        "")
            ;;
        *)
            print_error "未知选项: $1"
            show_usage
            exit 1
            ;;
    esac
    
    check_system
    check_dependencies
    clean_build
    configure_build
    build_project
    test_executable
    create_package
    
    echo ""
    print_success "=========================================="
    print_success "构建完成!"
    print_success "=========================================="
    echo "可执行文件: build-cli/bin/sokit-cli"
    echo "发布包: sokit-cli-linux-*.tar.gz"
    echo ""
    echo "测试命令:"
    echo "  ./build-cli/bin/sokit-cli --help"
    echo ""
}

# 运行主函数
main "$@" 